/*! \file InLogNeg.h
    \brief Interface do Modulo Logica de Negocios.
 */

#ifndef LogNeg
#define LogNeg

#ifdef LogNeg_Serv
#define ExtLN
#else
#define ExtLN extern
#endif

/*! \def ARQUIVO_PF
    \brief O nome do arquivo do Banco de dados usuario
*/

/*! \def NARQUIVO_PF
    \brief A type definition for a .
*/

/*! \def TAMANHOREG_PF
    \brief A type definition for a .
*/

/*! \def VARIAVELCONTROLE_PF
    \brief A type definition for a .
*/

/*! \def EXTENCAO_PF
    \brief ------------------------.
*/

#define USUARIOMESTRE "admin"
#define SENHAMESTRE "admin"
#define NUMEROALBUMSPORUSER 5
#define NUMEROFOTOSPORALBUM 10
#define NUMEROMAXTENTATIVAS 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "InPerAlb.h"
#include "InPerFot.h"
#include "InPerUsr.h"

/*! \struct FotoUsr
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct FotoUsr {
    char Cpf[12];       /**<Armazena o codigo da foto */
    char CodigAlbum[11];/**<Armazena o codigo da foto */
    char CodigFoto[11]; /**<Armazena o codigo da foto */
    char Nome[16];      /**<Armazena o nome da foto*/
    char Data[11];      /**<Armazena a data da foto*/
    char Veloc[4];      /**<Armazena o coeficiente da velocidade da foto \n ex.: para 1/2 Armazanamos 2*/
    char Abert[4];      /**<Armazena a Abertura com que a foto foi tirada*/
    char Iso[4];        /**<Armazena o iso da foto*/
    float Media;        /**< um float que Armazena a media da foto**/
    int NumerVotos;

    struct FotoUsr *Prox;
};

/*! \var typedef struct usuario_M User
    \brief Representacao do usuario
 */

typedef struct FotoUsr Foto_LN;

/**
   \struct AlbumStr
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct AlbumStr {
    char Cpf[12];    /**<  o cpf do usuario */
    char Codig[11];  /**<  o codigo do album do usuario*/
    char Nome[16];   /**<  o nome do usuario*/
    char Descr[31];  /**<  a descricao do album do usuario*/
    int NumerFotos;  /**< o numero de fotos de um determinado usuario*/
    int Priva;       /**<o nivel de acesso do album:\n	1 = Privado\n	2 = Publico*/

    Foto_LN *ListaFotos;
    struct AlbumStr *Prox;
};

/*! \var typedef struct AlbumStr Album
    \brief Representacao do usuario
 */
typedef struct AlbumStr Album_LN;

/**
   \struct Usuario
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct Usuario {
    char Cpf[12];    /**<que quarda o cpf do usuario */
    char Nome[16];   /**<que quarda o nome do usuario*/
    char Senha[5];   /**<que quarda a senha do usuario*/
    int NumerAlbum;  /**<o numero de albuns que um usuario tem*/

    Album_LN *ListaAlbum;
};

/*! \var typedef struct usuario_M User
    \brief Representacao do usuario
 */
typedef struct Usuario User_LN;

struct ListaUsuario_LN {
    char Cpf[12];                   /**< o cpf do usuario */
    char Nome[16];                  /**< o nome do usuario*/
    struct ListaUsuario_LN *Prox;   /**< Um ponteiro pro proximo elemento da lista de usuarios*/
};
/*! \var typedef struct usuario_M User
    \brief Representacao do usuario
 */

typedef struct ListaUsuario_LN ListaUsers_LN;

/*! \fn ExtLN int AddConta_LN (const char* CpfPass, const char* NomePass, const char* SenhaPass);
   \brief Responsavel por salvar o usuario.
   \param CpfPass: O cpf do ususario.
   \param NomePass : O nome do usuario.
   \param SenhaPass : O codigo do album a ser retornado.
   \return Um int que funciona com "bool":\n
     0 -  Album prenchido sucesso. \n
	-2 -  Usuario ja Cadastrado
	NG -  Erro nos arquivos.\n
*/
ExtLN int AddConta_LN (const char* CpfPass, const char* NomePass, const char* SenhaPass);

/*! \fn ExtLN int AddAlbum_LN (const char* CpfPass, Album_LN *AlbumPass)
   \brief Responsavel adcionar um novo album.
   \param CpfPass: O cpf do ususario a quem o album pertence.
   \param AlbumPass : o album com os dados a serem geredos.
   \return Um int que funciona com "bool":\n
     0 -  Album prenchido sucesso. \n
	-200 -  Album ja existe
	-2 - Numero maximo de abuns exedido
	NG -  Erro nos arquivos.\n
*/
ExtLN int AddAlbum_LN (const char* CpfPass, Album_LN *AlbumPass);

/*! \fn ExtLN int AddFoto_LN (const char* CpfPass, const char* CodigAlbumPass, Foto_LN *FotoPass)
   \brief Responsavel Armazenar uma Foto.
   \param CpfPass: O cpf do ususario a foto pertence.
   \param CodigPass : O codigo do album a foto pertence.
   \param FotoPass : uma foto para ser salva.
   \return Um int que funciona com "bool":\n
     0 -  Album prenchido sucesso. \n
	-200 -  Foto ja existe\n
	-2 - Numero maximo de fotos exedida\n
	NG -  Erro nos arquivos.\n
*/
ExtLN int AddFoto_LN (const char* CpfPass, const char* CodigAlbumPass, Foto_LN *FotoPass);

/*! \fn ExtLN int EditaConta_LN (const char* CpfPass, const char* NomePass, const char* SenhaPass);
   \brief Responsavel editar informacoes de um usuario.
   \param CpfPass: O cpf do ususario de quem  vai ser Atualizado.
   \param NomePass : O novo nome
   \param SenhaPass : a nova senha
   \return  Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
*/
ExtLN int EditaConta_LN (const char* CpfPass, const char* NomePass, const char* SenhaPass);

/*! \fn ExtLN int EditaAlbum_LN (Album_LN *AlbumPass);
   \brief Responsavel por atualizar uma struct album.
   \param AlbumPass : Os novos dados do album.
   \return Um int que funciona com "bool":\n
      0 -  Album atualizado sucesso. \n
     -1 -  Erro de Banco de dados.\n
	 -2 - Album nao existente.
*/
ExtLN int EditaAlbum_LN (Album_LN *AlbumPass);

/*! \fn ExtLN int EditaFoto_LN (Foto_LN *FotoPass);
   \brief Responsavel por atualizar uma foto.
   \param FotoPass : Os novos dados da foto.
   \return Um inteiro que diz o tipo de erro ocorrido:\n
      0 -  Se a senha esta correta\n
     -1 -  Erro de Banco de Dados\n
     -2 -  O Usuario nao existe\n
*/
ExtLN int EditaFoto_LN (Foto_LN *FotoPass);

/*! \fn ExtLN int DeletaConta_LN (const char *CpfPass, User_LN *UserPass);
   \brief Responsavel por deletar a conta e tudo que ela tem.
   \param CpfPass : O cpf do ususario.
   \param UserPass : Uma struct completa do user.
   \return Um inteiro que diz o tipo de erro ocorrido:\n
      0 -  apago\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int DeletaConta_LN (const char *CpfPass, User_LN *UserPass);

/*! \fn ExtLN int DeletaAlbum_LN (const char *CpfPass, const char *CodigAlbum, Album_LN *AlbumPass);
   \brief Responsavel por deletar o album e tudo que ele tem.
   \param CpfPass: O cpf do ususario.
   \param CodigAlbum : O codigo do album.
   \param AlbumPass : uma struct album completa.
   \return Um inteiro que diz o tipo de erro ocorrido:\n
      0 -  Se apago\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int DeletaAlbum_LN (const char *CpfPass, const char *CodigAlbum, Album_LN *AlbumPass);

/*! \fn ExtLN int DeletaFoto_LN (const char *CpfPass, const char *CodigAlbum, const char *CodigFoto);
   \brief Responsavel por pencher uma struct album.
   \param CpfPass: O cpf do ususario a quem a foto pertence.
   \param CodigAlbum : O codigo do album  de que a foto pertence.
   \param AlbumFoto : O codigo da foto a ser deletada.
   \return Um inteiro que diz o tipo de erro ocorrido:\n
      0 -  Se apago\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int DeletaFoto_LN (const char *CpfPass, const char *CodigAlbum, const char *CodigFoto);

/*! \fn ExtLN int FazLogin_LN (User_LN *UserPass);
   \brief Responsavel por pencher uma struct album.
   \param UserPass: Passa um usuario.
   \return Um inteiro que diz o tipo de erro ocorrido:\n
      0 -  Se a senha esta correta\n
     -2 -  Erro de Banco de Dados\n
	 -3 - UsuariBloqueado\n
	 -4 - Senha Iconrreta\n
*/
ExtLN int FazLogin_LN (User_LN *UserPass);

/*! \fn ExtLN int ListaAlbunsUsuario_LN (Album_LN **Publi, const char* CpfPass);
   \brief Responsavel listar os albums de um usuario.
   \param CpfPass: O cpf do ususario.
   \param Publi : um ponteiro onde a lista vai.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int ListaAlbunsUsuario_LN (Album_LN **Publi, const char* CpfPass);

/*! \fn ExtLN int ListaFotosAlbum_LN (Foto_LN **Fotos, const char *CpfPass, const char *CodigPass);
   \brief Responsavel por listar as fotos de um album.
   \param CpfPass: O cpf do ususario a quem o album pertence.
   \param CodigPass: O codigo do Album .
   \param Fotos : um ponteiro onde a lista vai.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int ListaFotosAlbum_LN (Foto_LN **Fotos, const char *CpfPass, const char *CodigPass);

/*! \fn ExtLN int ListaAlbunsPublicos_LN (Album_LN **Publi);
   \brief Responsavel por listar os albuns publicos
   \param Publi : um ponteiro onde a lista vai.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int ListaAlbunsPublicos_LN (Album_LN **Publi);

/*!\fn ExtLN int PegaUsuario_LN (User_LN *UserPass);
   \brief Responsavel por pencher uma struct Usuario.
   \param UserPass : O struct meia prechida para ser completada.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int PegaUsuario_LN (User_LN *UserPass);

/*! \fn ExtLN int PegaFoto_LN (Foto_LN *FotoPass);
   \brief Responsavel por pencher uma struct Foto.
   \param FotoPass : O struct meia prechida para ser completada.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int PegaFoto_LN (Foto_LN *FotoPass);

/*! \fn ExtLN int PegaAlbum_LN (Album_LN *AlbumPass)
   \brief Responsavel por pencher uma struct Album.
   \param AlbumPass : O struct meia prechida para ser completada.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int PegaAlbum_LN (Album_LN *AlbumPass);

/*! \fn ExtLN int VotaEmFoto_LN (Foto_LN* FotoPass, int ValorVoto)
   \brief Responsavel por pencher uma struct album.
   \param FotoPass: O cpf do ususario a quem o album pertence.
   \param ValorVoto : O codigo do album a ser retornado.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int VotaEmFoto_LN (Foto_LN* FotoPass, int ValorVoto);

/*! \fn ExtLN int MudaFotoAlbum_LN (Foto_LN* FotoPass, const char* CodigAlbum);
   \brief Muda uma foto de album.
   \param CodigAlbum : O codigo do  novo album.
   \param FotoPass : a estrutura da foto que vai ser mudada(Tem o album velho).
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int MudaFotoAlbum_LN (Foto_LN* FotoPass, const char* CodigAlbum);

/*! \fn ExtLN int ListaUsuariosBloqueados_LN (ListaUsers_LN **Bloqu);
   \brief Responsavel dar a lista de usuarios bloqueados.
   \param AlbumPego : O codigo do album a ser retornado.
   \return Um int que funciona com "bool":\n
      0 -  Sucesso\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int ListaUsuariosBloqueados_LN (ListaUsers_LN **Bloqu);

/*! \fn ExtLN int DesbloqueiaUsuario_LN (const char* CpfPass);
   \brief Responsavel por desbloquear usuario.
   \param Bloqu : um ponteiro onde a lista vai.
   \return Um int que funciona com "bool":\n
      0 -  Desbloqueado\n
     NG -  Erro de Banco de Dados\n
*/
ExtLN int DesbloqueiaUsuario_LN (const char* CpfPass);

/*! \fn ExtLN int VerificaAdmin_LN (const char* NomePass, const char* SenhaPass);
   \brief Responsavel por logar o adm.
   \param NomePass: o nome do administrador
   \param SenhaPass : a senha do administrador
   \return Um int que funciona com "bool":\n
      0 -  Logou\n
     NG -  Nao logou\n
*/
ExtLN int VerificaAdmin_LN (const char* NomePass, const char* SenhaPass);

#endif
